package com.fy.fyai.common.utils;

import cn.dev33.satoken.stp.StpUtil;
import com.fy.fyai.common.constant.KeysConstant;
import com.fy.fyai.common.constant.ResultMessageConstant;
import com.fy.fyai.common.ex.ConditionException;
import com.fy.fyai.common.ex.handler.ExHandler;
import com.fy.fyai.model.vo.LoginUserSession;

/**
 * 登录用户工具类
 * 用于在整个项目中方便地获取当前登录用户信息
 * 
 * @author fwq
 * @date 2025-10-25
 */
public class LoginUser {

    /**
     * 获取当前登录用户信息
     * 
     * @return 用户会话信息
     * @throws ConditionException 如果未登录则抛出异常
     */
    public static LoginUserSession getLoginUser() {
        // 检查是否登录
        ExHandler.throwIf(!StpUtil.isLogin(), ResultMessageConstant.NOT_LOGIN);
        // 从Sa-Token Session中获取用户信息
        LoginUserSession loginUserSession = (LoginUserSession) StpUtil.getSession().get(KeysConstant.LOGIN_SESSION_KEY);
        ExHandler.throwIf(loginUserSession == null, ResultMessageConstant.NOT_LOGIN);
        return loginUserSession;
    }

    /**
     * 获取当前登录用户ID
     *
     * @return 用户ID
     */
    public static Integer getLoginUserId() {
        LoginUserSession user = getLoginUser();
        return user.getId();
    }

    /**
     * 获取当前登录用户名
     * 
     * @return 用户名
     */
    public static String getLoginUserName() {
        LoginUserSession user = getLoginUser();
        return user.getUserName();
    }

    /**
     * 获取当前登录用户角色
     * 
     * @return 用户角色
     */
    public static String getLoginUserRole() {
        LoginUserSession user = getLoginUser();
        return user.getUserRole();
    }

    /**
     * 检查是否是管理员
     * 
     * @return true-是管理员，false-不是管理员
     */
    public static boolean isAdmin() {
        String role = getLoginUserRole();
        return "admin".equals(role);
    }

    /**
     * 检查是否已登录
     * 
     * @return true-已登录，false-未登录
     */
    public static boolean isLogin() {
        return StpUtil.isLogin();
    }

    /**
     * 退出登录
     */
    public static void logout() {
        if (StpUtil.isLogin()) {
            StpUtil.logout();
        }
    }
}
